import os
from .base import ImageProcessor
from PIL import Image, ImageChops
from ui import ImageProcessorUI

class SubtractProcessor(ImageProcessor):
    def process(self, image: Image.Image, **kwargs) -> Image.Image:
        """
        执行数字减影操作。
        参数:
        - image: Image.Image，输入的图像对象。
        - ref_image: Image.Image，参考图像对象用于减影。
        返回:
        - Image.Image，减影后的结果图像。
        """
        ref_image = kwargs.get("ref_image")
        if ref_image is None:
            raise ValueError("未提供参考图像")
        # 检查图像大小是否一致
        if image.size != ref_image.size:
            raise ValueError(f"图像尺寸不匹配：原图 {image.size} vs 参考图 {ref_image.size}")
        # 统一转换为灰度图以避免通道差异
        image_gray = image.convert("L")
        ref_gray = ref_image.convert("L")
        # 使用 PIL 的 ImageChops.difference 进行像素级减法
        return ImageChops.difference(image_gray, ref_gray)

    def get_ui_parameters(self, ui: "ImageProcessorUI") -> dict:
        """
        从 UI 获取当前面板的参数。
        返回一个字典，供 process 使用。
        """
        ref_path = ui.subtract_ref_path_var.get()
        if not ref_path or not os.path.isfile(ref_path):
            ui.show_error("请提供有效的参考图像文件路径")
            return {}
        try:
            ref_image = Image.open(ref_path).convert("L")
        except Exception as e:
            ui.show_error(f"无法打开参考图像: {e}")
            return {}
        return {"ref_image": ref_image}